
//3453.分割正方形I
class Solution {

    //判断以t为分界线是否满足条件
    bool check(vector<vector<int>>& squares,double t)
    {
        double down=0,up=0;
        for(auto& nums:squares)
        {
            double x=nums[0],y=nums[1],len=nums[2];
            if(y+len>t)
            up+= len*min(y+len-t,len);  //注意此处不能直接将len*(y-len-t)其中间可能有空隙
            if(y<t)
            down+= len*min(t-y,len);
        }
        return up<down||abs(up-down)<=1e-5;  //当下面面积大时right就需要下移，当满足条件时right也下移找最小值
    }

public:
    double separateSquares(vector<vector<int>>& squares) {
        double left=0,right=0;
        for(auto nums: squares)
        if(nums[1]+nums[2]>right) right=nums[1]+nums[2];

        for(int i=0;i<48;i++)  //通过计算可以设置循环次数来对数据进行精确
        {
            double mid=left+(right-left)/2.0;
            if(check(squares,mid)) right=mid;
            else left=mid;
        }
        return right;
    }
};